package org.ymf.controller;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import com.github.pagehelper.PageInfo;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.layuiframework.stereotype.util.ValidGroup;
import java.util.ArrayList;
import java.util.List;
import org.ymf.service.PostService;
import org.ymf.entity.Post;
import org.ymf.vo.PostVo;
import lombok.Data;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 帖子 前端控制器
 * </p>
 *
 * @author Malphite
 * @since 2023-08-01
 */
@Data
@RestController
@RequestMapping("/post")
public class PostController {

    @Resource
    private PostService postService;


    /**
     * 分页查询帖子
     * @param vo        可选条件 、 开始时间(startTime)、结束时间(endTime)、
     * @return          帖子分页信息
     */
    @PostMapping("/pagePost")
    public PageInfo<Post> pagePost(@RequestBody PostVo vo){
        return postService.pagePost(vo);
    }

    /**
     * 列表查询帖子
     * @param vo        可选条件 、 开始时间(startTime)、结束时间(endTime)、
     * @return          帖子列表信息
     */
    @PostMapping("/listPost")
    public List<Post> listPost(@RequestBody PostVo vo){
        return postService.listPost(vo);
    }

    /**
     * 添加帖子基础信息
     * @param post       帖子信息
     * @return          成功or失败
     */
    @PostMapping("/addPost")
    public boolean addPost(@RequestBody @Validated({ValidGroup.Insert.class}) Post post, HttpServletRequest request){
        return postService.addPost(post, request);
    }

    /**
     * 更新帖子基础信息
     * @param post       帖子信息, 主键信息必填
     * @return          成功or失败
     */
    @PostMapping("/updatePost")
    public boolean updatePost(@RequestBody @Validated({ValidGroup.Update.class}) Post post){
        return postService.updatePost(post);
    }

    /**
     * 删除帖子基础信息
     * @param post       帖子信息, 主键信息必填
     * @return          成功or失败
     */
    @PostMapping("/deletePost")
    public boolean deletePost(@RequestBody @Validated({ValidGroup.Delete.class}) Post post){
        return postService.deletePost(post);
    }

    /**
     * 帖子excel导入
     * @param file 前端传入的文件[一个or多个，这里导入只整一个]
     * @param request 请求对象
     * @return          成功or失败
     */
    @PostMapping("/excelPost")
    public boolean excelPost(@RequestPart(value = "file") MultipartFile file, HttpServletRequest request){
        return postService.excelPost(file, new ArrayList<>(), request) == null;
    }

    /**
     * 帖子excel导出
     * @param vo  页面传入参数(startTime:开始时间;endTime:结束时间 )
     * @param response 响应对象
     * @return   无返回值，通过响应对象响应信息
     * @throws Exception  调用方法可能发生io异常等
     */
    @GetMapping("/exportPost")
    public void exportPost(PostVo vo, HttpServletResponse response) throws Exception{
        postService.exportPost(vo, response);
    }

     /**
     * 分页查询帖子 => 根据 lasticsearch 查询信息
     * @param vo        可选条件 、 开始时间(startTime)、结束时间(endTime)、
     * @return          帖子分页信息
     */
     @PostMapping("/pagePostEs")
     public PageInfo<Post> pagePostEs(@RequestBody PostVo vo){
         return postService.pagePostEs(vo);
     }

}
